package com.oa.dao;

import com.oa.bean.Dept;
import com.oa.bean.PageInfo;
import com.oa.util.DataSource;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/*
    private int id;
    private String name;
    private String remark;
 */

//dao是表示为数据库持久层的操作类  DeptDao是针对dept表的数据库操作
public class DeptDao {

    //1、将操作以类和方法的形式进行封装 2、通过方法入参实现数据的动态入参【目的：实现代码复用】
    public boolean insertDept(Dept dept) {
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "insert into dept_inf(NAME,REMARK) values(?,?);";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            //给占位符进行赋值 //第一个参数为占位符的位置
            ps.setString(1,dept.getName());
            ps.setString(2,dept.getRemark());
            //4、通过sql语句对象来执行sql语句
            int result = ps.executeUpdate();//添加、删除、修改sql都可以使用executeUpdate方法执行
            // result为执行sql语句的影响行数、成功为大于0，否则小于等于0
            // 如果在try或者catch里面遇到return，那么函数在执行完return后面的表达式之后，会先去执行finally里面的语句块，然后再结束方法体。
            // 除非try里面有类似System.exit()的方法。
            return result>0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return false;
    }
    
    //2、定义删除
    public boolean deleteDept(int id) {
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "delete from dept_inf where id=?;";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            //给占位符赋值
            ps.setInt(1,id);
            //4、通过sql语句对象来执行sql语句
            int result = ps.executeUpdate();//添加、删除、修改sql都可以使用executeUpdate方法执行
            // result为执行sql语句的影响行数、成功为大于0，否则小于等于0
            return result>0;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return false;
    }

    //3、定义修改
    public boolean updateDept(Dept dept) {
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "update dept_inf set NAME=?,REMARK=? where id=?;";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            //给占位符进行赋值 //第一个参数为占位符的位置
            ps.setString(1,dept.getName());
            ps.setString(2,dept.getRemark());
            ps.setInt(3,dept.getId());

            //4、通过sql语句对象来执行sql语句
            int result = ps.executeUpdate();//添加、删除、修改sql都可以使用executeUpdate方法执行
            // result为执行sql语句的影响行数、成功为大于0，否则小于等于0
            return result>0;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return false;
    }

    //4、定义查询所有dept数据
    public List<Dept> queryDept() {
        //创建一个list集合用于保存查询到数据
        List<Dept> deptList = new ArrayList<>();
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet result = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "select * from dept_inf;";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            //4、通过sql语句对象来执行sql语句
            result = ps.executeQuery();//查询语句使用executeQuery方法执行，返回的是结果集ResultSet
            // result为结果集，里面包含了所有的查询结果
            int id;
            String name,remark;
            while(result.next()){//next方法用于判断当前的结果集中是否有下一条数据
                //有下一条数据，则通过结果集中的get()方法来获取数据   注意这是一条记录
                id = result.getInt("id");
                name = result.getString("name");
                remark = result.getString("remark");
                //将数据进行封装，封装到dept对象中
                Dept dept = new Dept(id,name,remark);
                //将dept对象添加到集合中
                deptList.add(dept);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
                if (result != null) {
                    result.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //返回集合对象
        return deptList;
    }

    //5、--定义dept的根据id查询的方法（入参id）
    public Dept queryDeptById(int id) {
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet result = null;
        String name,remark;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "select * from dept_inf where id=?;";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            ps.setInt(1, id);
            //4、通过sql语句对象来执行sql语句
            result = ps.executeQuery();//查询语句使用executeQuery方法执行，返回的是结果集ResultSet
            // result为结果集，里面包含了所有的查询结果
            if(result.next()){//next方法用于判断当前的结果集中是否有下一条数据
                //有下一条数据，则通过结果集中的get()方法来获取数据   注意这是一条记录
                name = result.getString("name");
                remark = result.getString("remark");
                //将数据进行封装，封装到dept对象中
                //将dept进行返回
                return new Dept(id,name,remark);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
                if (result != null) {
                    result.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //返回集合对象
        return null;
    }

    //6、定义查询所有dept数据
    public List<Dept> queryDept(PageInfo pageInfo,String...paramas) {
        //创建一个list集合用于保存查询到数据
        List<Dept> deptList = new ArrayList<>();
        Connection connection = null;
        PreparedStatement ps = null;
        ResultSet result = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "select * from dept_inf ";
            int addCondition = 0;

            if(paramas!=null&&paramas.length>1) {//需要设置占位符
                // 1.是补充的条件 例如: sql
                sql += " where "+ paramas[0];
            }
            sql += " limit ?,? ";
            //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
            // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
            ps = connection.prepareStatement(sql);
            // 2.补充参数
            for (int i = 1;paramas!=null && i < paramas.length; i++) {
                ps.setString(i,paramas[i]);
                addCondition += 1;
            }
            // 设置limit参数数据
            ps.setInt(addCondition + 1, pageInfo.getStartIndex());
            ps.setInt(addCondition + 2, pageInfo.getPageSize());
            //4、通过sql语句对象来执行sql语句
            result = ps.executeQuery();//查询语句使用executeQuery方法执行，返回的是结果集ResultSet
            int id ;
            String name , remark;
            // result为结果集，里面包含了所有的查询结果
            while(result.next()){//next方法用于判断当前的结果集中是否有下一条数据
                //有下一条数据，则通过结果集中的get()方法来获取数据   注意这是一条记录
                id = result.getInt("id");
                name = result.getString("name");
                remark = result.getString("remark");
                //将数据进行封装，封装到dept对象中
                Dept dept = new Dept(id,name,remark);
                //将dept对象添加到集合中
                deptList.add(dept);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
                if (result != null) {
                    result.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //返回集合对象
        return deptList;
    }

    //7、定义查询dept总数据记录
    public  int queryDeptCount(String...paramas) {
        Connection connection = null;
        PreparedStatement ps = null;
        try {
            //1、获取数据库链接的对象
            connection = DataSource.getConnection();
            //2、定义sql语句
            String sql = "select count(*) from dept_inf ";
            // 补充数据库
            if(paramas!=null&&paramas.length>1) {//需要设置占位符
                // 1.是补充的条件 例如: sql
                sql += " where "+ paramas[0];
                ps = connection.prepareStatement(sql);
                // 2.后面是参数
                for (int i = 1; i < paramas.length; i++) {
                    ps.setString(i,paramas[i]);
                }
            }else {
                //3、通过数据库链接来获取sql的语句对象【语句对象是用于执行sql语句的】
                // prepareStatement方法来得到一个预编译的sql语句对象，要入参sql语句
                ps = connection.prepareStatement(sql);
            }
            //4、通过sql语句对象来执行sql语句
            ResultSet result = ps.executeQuery();//查询语句使用executeQuery方法执行，返回的是结果集ResultSet
            // result为结果集，里面包含了所有的查询结果
            if (result.next()) {//next方法用于判断当前的结果集中是否有下一条数据
                return result.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            try {
                if (ps != null) {
                    ps.close();
                }
                DataSource.close(connection);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        //没有返回0
        return 0;
    }
}
